<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>尾调用优化的代码</title>
</head>
<body>
  <script>
    function fib(n) {
      if (n < 2) {
        return n;
      }

      return fib(n - 1) + fib(n - 2);  // 不符合尾调用优化的条件，因为有相加操作
    }

    console.log(fib(0));  // 0
    console.log(fib(1));  // 1
    console.log(fib(2));  // 1
    console.log(fib(3));  // 2
    console.log(fib(4));  // 3
    console.log(fib(5));  // 5
    console.log(fib(6));  // 8
    // console.log(fib(1000));  // 崩溃
  </script>

  <script>
    // 优化后
    "use strict";

    // 基础框架
    function fib(n) {
      return fibImpl(0, 1, n);
    }

    function fibImpl(a, b, n) {
      if (n === 0) {
        return a;
      }
      return fibImpl(b, a + b, n - 1);
    }

    console.log(fib(1000));  // 4.346655768693743e+208
  </script>
</body>
</html>